package cn.seaboot.admin.user.context;

import cn.seaboot.admin.user.bean.User;
import cn.seaboot.admin.user.bean.UserDept;
import org.jetbrains.annotations.NotNull;

/**
 * 用户上下文，获取当前登录的用户信息，
 * 对于不同的鉴权框架，写法上会有区别，这里定制了统一标准
 *
 * @author Mr.css on 2018年4月18日
 */
public interface UserContext {

    /**
     * 获取当前登录的用户
     *
     * @return User
     */
    @NotNull User getUser();

    /**
     * 获取当前登录的用户ID
     *
     * @return 用户ID
     */
    @NotNull String getUserId();

    /**
     * 获取用户名
     *
     * @return 用户名
     */
    @NotNull String getUsername();

    /**
     * 获取用户所在公司ID
     *
     * @return 公司ID
     */
    @NotNull String getOrgId();

    //  Dept----------------------------

    /**
     * 查询用户分组
     *
     * @return 用户分组
     */
    @NotNull UserDept getUserDept();

    /**
     * 数据的层级查询，基本遵循1个原则，只查询下级的数据，如果要查看同级的数据，可以用PID进行查询。
     *
     * @return 部门ID
     */
    @NotNull String getUserDeptPid();

    /**
     * 获取用户所在的部门ID，用于维护数据的上下层级关系
     *
     * @return 部门ID
     */
    @NotNull String getUserDeptId();

    /**
     * （业务场景：仅某分组可以执行相关操作）
     * 获取分组编码，除ID之外的唯一标识，用于制作权限系统，与Security的hasRole()语法对应。
     * 注意：编码会被写到代码中，随意编写不生效，权限定好后，不允许后期修改。
     *
     * @return 分组编码
     */
    @NotNull String getUserDeptCode();

    /**
     * 与MySQL查询相关，与全国行政区划类似，
     * 福建省是3500700，永泰县是350709，他们的前缀是一样的
     *
     * @return 用户所在分组
     */
    @NotNull String getUserPath();

    /**
     * 目标分组是否是登录用户的直属上级，可以跨等级
     *
     * @param groupId 目标部门ID
     * @return boolean
     */
    boolean isMySuperior(String groupId);

    /**
     * 目标分组是否是登录用户的直属上级，可以跨等级
     *
     * @param target 目标分组
     * @return boolean
     */
    boolean isMySuperior(UserDept target);

    /**
     * 目标分组是否是登录用户的下属，可以跨等级
     *
     * @param groupId 目标部门ID
     * @return boolean
     */
    boolean isMyUnderling(String groupId);

    /**
     * 目标分组是否是登录用户的下属，可以跨等级
     *
     * @param target 目标分组
     * @return boolean
     */
    boolean isMyUnderling(UserDept target);
}
